package models;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.Entity;
import javax.persistence.Id;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.Page;
import play.data.validation.Constraints;
import play.db.ebean.Model;

/**
 * Modele de l'objet NiveauQuestion Un NiveauQuestion défini la difficulté d'une
 * question. Chaque Niveau question est associé a un nombre de point positif et
 * negatif pour un QCM. (voir QcmNiveauquestion).
 * 
 * @author ProjetSI-QCM
 */
@SuppressWarnings("serial")
@Entity
public class NiveauQuestion extends Model {
	/**
	 * Identifiant du NiveauQuestion.
	 */
	@Id
	private Long idNiveauQ;

	/**
	 * Libelle du Niveau.
	 */
	@Constraints.Required
	private String libelleNiveau;

	/**
	 * Finder du Modele NiveauQuestion.
	 */
	private static Finder<Long, NiveauQuestion> find = 
			new Finder<Long, NiveauQuestion>(
			Long.class, NiveauQuestion.class);

	/**
	 * La méthode permet de retrouver un NiveauQuestion à partir de son ID.
	 * 
	 * @param id
	 *            Identifiant du NiveauQuestion
	 * @return NiveauQuestion L'objet
	 */
	public static NiveauQuestion findById(final Long id) {
		return Ebean.find(NiveauQuestion.class, id);
	}

	/**
	 * Récupere tous les NiveauQuestion stockés en Base de Données.
	 * 
	 * @return List<NiveauQuestion> Liste de tous les NiveauQuestion
	 */
	public static List<NiveauQuestion> findAll() {
		return find.all();
	}

	/**
	 * Liste des options pour les listes déroulantes.
	 * 
	 * @return Map<String,String>
	 */
	public static Map<String, String> options() {
		final LinkedHashMap<String, String> options = 
				new LinkedHashMap<String, String>();
		for (NiveauQuestion c : NiveauQuestion.find.orderBy("libelleNiveau")
				.findList()) {
			options.put(c.getIdNiveauQ().toString(), c.getLibelleNiveau()
					.toString());
		}
		return options;
	}

	/**
	 * Permet de créer un Objet NiveauQuestion en Base de Données.
	 * 
	 * @param nivQuestion
	 *            L'objet à créer
	 */
	public static void create(final NiveauQuestion nivQuestion) {
		nivQuestion.save();
	}

	/**
	 * Permet de mettre à jour un Objet NiveauQuestion en Base de Données.
	 * 
	 * @param nivQuestion
	 *            L'objet à mettre à jour
	 */
	public static void update(final NiveauQuestion nivQuestion) {
		nivQuestion.update();
	}

	/**
	 * Permet la suppression d'un Niveau Question en Base de Données.
	 * 
	 * @param id
	 *            L'identifiant du NiveauQuestion
	 */
	public static void delete(final Long id) {
		NiveauQuestion nq = NiveauQuestion.findById(id);
		for (Question question : Question.findByNiveauQuestion(nq)) {
			Question.delete(question.getIdQuestion());
		}
		for (QcmNiveauquestion qnq : QcmNiveauquestion
				.findByQcmNiveauQuestion(nq)) {
			QcmNiveauquestion.delete(qnq.getIdQcmNiveauQuestion());
		}
		find.ref(id).delete();
	}

	/**
	 * Retourne une Page de NiveauQuestion.
	 * 
	 * @param page
	 *            Page à afficher
	 * @param pageSize
	 *            Nombre d'objets par page
	 * @param sortBy
	 *            Propriété utilisée pour le tri
	 * @param order
	 *            Sens du tri (asc ou desc)
	 * @param filter
	 *            Filtre appliqué sur le nom de la colonne
	 * @return Page<NiveauQuestion> la page
	 */
	public static Page<NiveauQuestion> page(final int page, final int pageSize,
			final String sortBy, final String order, final String filter) {
		return find.where().ilike("idNiveauQ", "%" + filter + "%")
				.orderBy(sortBy + " " + order).findPagingList(pageSize)
				.setFetchAhead(false).getPage(page);
	}

	/**
	 * @return the idNiveauQ
	 */
	public final Long getIdNiveauQ() {
		return idNiveauQ;
	}

	/**
	 * @param id
	 *            the idNiveauQ to set
	 */
	public final void setIdNiveauQ(final Long id) {
		this.idNiveauQ = id;
	}

	/**
	 * @return the libelleNiveau
	 */
	public final String getLibelleNiveau() {
		return libelleNiveau;
	}

	/**
	 * @param libelle
	 *            the libelleNiveau to set
	 */
	public final void setLibelleNiveau(final String libelle) {
		this.libelleNiveau = libelle;
	}

}
